Warning: Undefined array key "HTTP_ACCEPT_LANGUAGE" in /var/www/vhosts/bilgigunlugum.net/httpdocs/index.php on line 43
Windows API Programlama

BG MVC Model View Controller eğitim serisi yayında...

Ana page > Programlama > Windows API Programlama > CheckBox

CheckBox

► Kontroller

Check Box kontrolü, BUTTON kontrolü altında tanımlanan bir kontroldür. Check Box, kare şeklinde bir kutu ve program içinde tanımlanan bir metin veya küçük bir resimden (icon veya bitmap) oluşur. Check Box, kullanıcının program için gerekli olan belirli seçenekleri tercih edip etmediğini belirlemek için kullanılır.

Check Box kontrolü, CreateWindowEx() fonksiyonunun lpClassName parametresi içinde BUTTON veya WC_BUTTON değeri ile tanımlanan bir kontroldür.

BUTTON değerini kullanırsanız programın başında windows.h başlık dosyasını dahil etmeniz yeterlidir, ancak WC_BUTTON değerini kullanırsanız commctrl.h başlık dosyasını dahil etmeniz gerekir.

Bir Check Box kontrolü, CreateWindowEx() fonksiyonunun dwStyle parametresi içinde tanımlanan, aşağıdaki 4 tipten birine sahiptir:

BS_CHECKBOX : Standart tip

BS_AUTOCHECKBOX : Otomatik tip

BS_3STATE : Üç konumlu tip

BS_AUTO3STATE : Otomatik üç konumlu tip

Her tipin işaretlenmiş (kutu içinde bir check işareti) ve işaretsiz (check işaretsiz) olmak üzere 2 konumu vardır. Üç konumlu olan son iki tip ise ilaveten, kullanıcının bir seçim yapmadığını göstermeye yarayan, belirsiz konum seçeneği (kutu içi boyalı) içermektedir. Standart ve otomatik tiplere peş peşe tıklamak iki konum arasında değişim sağlayarak, check işaretini ekler veya kaldırır. Üç konumlu tiplere peş peşe tıklamak ise check işaretinin olduğu durumdan, belirsiz konuma oradan da check işaretinin kaldırıldığı duruma geçişi sağlar ve döngü bu şekilde tekrar eder.

Kullanıcı bir Check Box'a tıkladığında klavye kontrolü Check Box'a geçer. Sistem ana pencereye BN_CLICKED bildirim kodu içeren bir WM_COMMAND mesajı gönderir. Eğer bu mesaj otomatik veya otomatik üç konumlu bir Check Box'tan gelirse, sistem bu tipler için check konumunu ayarlayacağından, ana pencerenin bu mesaja işlem yapması gerekmez. Eğer mesaj standart veya üç konumlu bir Check Box'tan gelirse, ana pencerenin bu mesaja işlem yapması gerekir. Check Box tipini dikkate almadan, sistem, konumu değiştiğinde, Check Box penceresini yeniden boyar.

Şimdi, programımıza BUTTON kontrol yoluyla Check Box kontrolleri eklemeye çalışalım.

Aşağıdaki 5 satır programın başına global değerler olarak eklenir:


#define IDC_CHECKBOX01 321 /* Check Box için tanımlayıcı makro bildirimi */
#define IDC_CHECKBOX02 322 /* Check Box için tanımlayıcı makro bildirimi */
#define IDC_CHECKBOX03 323 /* Check Box için tanımlayıcı makro bildirimi */
#define IDC_CHECKBOX04 324 /* Check Box için tanımlayıcı makro bildirimi */
/* Check Box kontrolleri için pencere Handle değeri bildirimi */
HWND hwndCheckBox01, hwndCheckBox02, hwndCheckBox03, hwndCheckBox04;

WindowProcedure() fonksiyonu içinde renkli olarak gösterilen satırlar ile her biri ayrı tipte 4 adet Check Box kontrolü oluşturulur. WM_COMMAND mesajına işlem yapılarak Check Box kontrolleri ile ilgili işlemler belirlenir:


LRESULT CALLBACK WindowProcedure (HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
  UINT ret;
  
  switch (message)
  { 
    case WM_CREATE:
	
         hwndCheckBox01 = CreateWindowEx(0, "BUTTON", "Standart Check Box",
                             WS_CHILD | WS_VISIBLE | BS_CHECKBOX, 20, 20, 250, 25,
                             hwnd, (HMENU) IDC_CHECKBOX01, NULL, NULL);

         hwndCheckBox02 = CreateWindowEx(0, "BUTTON", "Otomatik Check Box",
                             WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, 20, 60, 250, 25,
                             hwnd, (HMENU) IDC_CHECKBOX02, NULL, NULL);

         hwndCheckBox03 = CreateWindowEx(0, "BUTTON", "Üç konumlu Check Box",
                             WS_CHILD | WS_VISIBLE | BS_3STATE, 20, 100, 250, 25,
                             hwnd, (HMENU) IDC_CHECKBOX03, NULL, NULL);
							 
         hwndCheckBox04 = CreateWindowEx(0, "BUTTON", "Otomatik üç konumlu Check Box",
                             WS_CHILD | WS_VISIBLE | BS_AUTO3STATE, 20, 140, 250, 25,
                             hwnd, (HMENU) IDC_CHECKBOX04, NULL, NULL);

         break;		 

    case WM_COMMAND:
	
         if (HIWORD(wParam) == BN_CLICKED) {
             if (LOWORD(wParam) == IDC_CHECKBOX01) {
                 CheckDlgButton(hwnd, IDC_CHECKBOX01, 
                                      !IsDlgButtonChecked (hwnd, IDC_CHECKBOX01));
             }		 
		 
             if (LOWORD(wParam) == IDC_CHECKBOX03) {
                 ret = IsDlgButtonChecked (hwnd, IDC_CHECKBOX03);
                 if (ret==BST_CHECKED) {
                     CheckDlgButton(hwnd, IDC_CHECKBOX03, BST_INDETERMINATE);
                 } 
                 else if (ret==BST_UNCHECKED) {
                     CheckDlgButton(hwnd, IDC_CHECKBOX03, BST_CHECKED);
                 }		
                 else {
                     CheckDlgButton(hwnd, IDC_CHECKBOX03, BST_UNCHECKED);
                 }
             }		 
         }          
	  
         break;
		 
    case WM_DESTROY:
         PostQuitMessage (0);
         break;
		 
    default:                 
         return DefWindowProc (hwnd, message, wParam, lParam);
  }

  return 0;
}

Check Box kontrol pencereleri oluşturulurken, CreateWindowEx() fonksiyonunun lpClassName parametresi için sistemdeki ön tanımlı değerlerden biri olan BUTTON değeri, dwStyle parametresi için ise sırasıyla BS_CHECKBOX, BS_AUTOCHECKBOX, BS_3STATE ve BS_AUTO3STATE değerleri kullanılır.

Program çalıştığında:

  • Program penceresi oluşturulur oluşturulmaz WM_CREATE mesajı mesaj işlem fonksiyonuna gönderilir. switch yapısının bu seçeneği altında CreateWindowEx() fonksiyonu ile 4 adet Check Box kontrolü oluşturulur.
  • Kontroller tarafından ana pencereye gönderilen bildirim mesajlarına işlem yapmak üzere ana pencere mesaj işlem fonksiyonu içinde oluşturulan WM_COMMAND seçeneği altında BN_CLICKED bildirim mesajı geldiğinde, kullanıcının IDC_CHECKBOX01 veya IDC_CHECKBOX03 kontrolleri üzerine yaptığı tıklamaların karşılığı olan gerekli işlemler IsDlgButtonChecked() ve CheckDlgButton() fonksiyonları kullanılarak yapılır:
    • Önce, IsDlgButtonChecked() fonksiyonu yoluyla Check Box kontrolünün durumu belirlenir.
    • IsDlgButtonChecked() fonksiyonu ile elde edilen değere bağlı olarak CheckDlgButton() fonksiyonu ile Check Box'ın yeni durumu ayarlanır.
  • Kullanıcı IDC_CHECKBOX02 veya IDC_CHECKBOX04 kontrolleri üzerine tıkladığında, sistem seçenek değişikliğini otomatik olarak yaptığından, WM_COMMAND seçeneği altında herhangi bir işlem yapmaya gerek yoktur.

Programın çalışan en son hali aşağıdadır:


#include <windows.h>

#define IDC_CHECKBOX01 321
#define IDC_CHECKBOX02 322
#define IDC_CHECKBOX03 323
#define IDC_CHECKBOX04 324

LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

char szClassName[ ] = "WinAPIWindowsApp";
HINSTANCE ghInst;

HWND hwndCheckBox01, hwndCheckBox02, hwndCheckBox03, hwndCheckBox04;

int WINAPI WinMain (HINSTANCE hThisInstance, 
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nCmdShow)
{
  HWND hwndMain;         
  MSG messages;      
  WNDCLASSEX wincl;

  ghInst = hThisInstance;

  wincl.hInstance = hThisInstance;
  wincl.lpszClassName = szClassName;
  wincl.lpfnWndProc = WindowProcedure;
  wincl.style = CS_DBLCLKS;           
  wincl.cbSize = sizeof (WNDCLASSEX);

  wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
  wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
  wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
  wincl.lpszMenuName = NULL; 
  wincl.cbClsExtra = 0; 
  wincl.cbWndExtra = 0; 
  wincl.hbrBackground = GetSysColorBrush(COLOR_3DFACE);

  if (!RegisterClassEx (&wincl)) return 0;

  hwndMain = CreateWindowEx (0, szClassName, "WinAPI Temel Program", WS_OVERLAPPEDWINDOW, 
                         CW_USEDEFAULT, CW_USEDEFAULT, 544, 375, HWND_DESKTOP, NULL, 
                         hThisInstance, NULL);
						 
  if (!hwndMain) return 0;

  ShowWindow (hwndMain, nCmdShow);
  UpdateWindow(hwndMain);

  while (GetMessage (&messages, NULL, 0, 0) > 0) {
    TranslateMessage(&messages);
    DispatchMessage(&messages);
  }	
	
  return messages.wParam;
}

LRESULT CALLBACK WindowProcedure (HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
  UINT ret;

  switch (message)
  { 
    case WM_CREATE:
	
         hwndCheckBox01 = CreateWindowEx(0, "BUTTON", "Standart Check Box",
                             WS_CHILD | WS_VISIBLE | BS_CHECKBOX, 20, 20, 250, 25,
                             hwnd, (HMENU) IDC_CHECKBOX01, NULL, NULL);

         hwndCheckBox02 = CreateWindowEx(0, "BUTTON", "Otomatik Check Box",
                             WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, 20, 60, 250, 25,
                             hwnd, (HMENU) IDC_CHECKBOX02, NULL, NULL);

         hwndCheckBox03 = CreateWindowEx(0, "BUTTON", "Üç konumlu Check Box",
                             WS_CHILD | WS_VISIBLE | BS_3STATE, 20, 100, 250, 25,
                             hwnd, (HMENU) IDC_CHECKBOX03, NULL, NULL);
							 
         hwndCheckBox04 = CreateWindowEx(0, "BUTTON", "Otomatik üç konumlu Check Box",
                             WS_CHILD | WS_VISIBLE | BS_AUTO3STATE, 20, 140, 250, 25,
                             hwnd, (HMENU) IDC_CHECKBOX04, NULL, NULL);

         break;		 

    case WM_COMMAND:
	
         if (HIWORD(wParam) == BN_CLICKED) {
             if (LOWORD(wParam) == IDC_CHECKBOX01) {
                 CheckDlgButton(hwnd, IDC_CHECKBOX01, 
                                      !IsDlgButtonChecked (hwnd, IDC_CHECKBOX01));
             }		 
		 
             if (LOWORD(wParam) == IDC_CHECKBOX03) {
                 ret = IsDlgButtonChecked (hwnd, IDC_CHECKBOX03);
                 if (ret==BST_CHECKED) {
                     CheckDlgButton(hwnd, IDC_CHECKBOX03, BST_INDETERMINATE);
                 } 
                 else if (ret==BST_UNCHECKED) {
                     CheckDlgButton(hwnd, IDC_CHECKBOX03, BST_CHECKED);
                 }		
                 else {
                     CheckDlgButton(hwnd, IDC_CHECKBOX03, BST_UNCHECKED);
                 }
             }		 
         }          
	  
         break;
		 
    case WM_DESTROY:
         PostQuitMessage (0);
         break;
		 
    default:                 
         return DefWindowProc (hwnd, message, wParam, lParam);
  }

  return 0;
}

Program çalıştığında karşınıza gelecek ekran görüntüsü aşağıdadır: